package es.deusto.eside.programacion4.mario2d.Bd.database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.newdawn.slick.util.Log;

import es.deusto.eside.programacion4.mario2d.Bd.domain.*;

public class GestorBD {

	private static GestorBD instance = null;

	private Connection conn;

	public static GestorBD getInstance() {
		if (instance == null)
			instance = new GestorBD();
		return instance;
	}

	public void connect() throws ClassNotFoundException, SQLException {
		Class.forName("org.sqlite.JDBC");

		conn = DriverManager
				.getConnection("jdbc:sqlite:resources/SQLite/Mario.db");
	}

	public void disconnect() throws SQLException {
		conn.close();
	}

	public void clear() throws SQLException {
		Statement stat = conn.createStatement();
		stat.executeQuery("Delete from Jugador");
		stat.close();
	}

	public List<Jugador> listJugador() throws SQLException {
		final List<Jugador> jugador = new ArrayList<Jugador>();

		Statement stat = conn.createStatement();
		ResultSet rs = stat.executeQuery("Select * from Jugador");

		System.out.println("Lista Jugador");
		System.out.println("------");
		while (rs.next()) {
			final Jugador player = new Jugador(rs.getString("name"),
					rs.getInt("puntos"));
			Log.error("nombre: " + player.getNombre() + " "
					+ player.getPuntos());
			jugador.add(player);
		}

		rs.close();

		stat.close();
		// Devuelve la lista ordenada
		Collections.sort(jugador, new Comparator<Jugador>() {

			@Override
			public int compare(Jugador o1, Jugador o2) {
				if (o1.getPuntos() == o2.getPuntos()) {
					return 0;
				} else if (o1.getPuntos() < o2.getPuntos()) {
					return 10;
				} else {
					return -1;
				}
			}
		});

		return jugador;
	}

	public Jugador getJugador(String playerName) throws SQLException {
		PreparedStatement stat = conn
				.prepareStatement("select * from jugador where name = ?");
		stat.setString(1, playerName);

		ResultSet rs = stat.executeQuery();

		Jugador player = null;
		if (rs.next())
			player = new Jugador(rs.getString("name"), rs.getInt("puntos"));

		rs.close();

		stat.close();

		return player;
	}

	public Jugador addJugador(final Jugador j) throws SQLException {
		PreparedStatement stat = conn
				.prepareStatement("insert into jugador values (?, ?)");
		stat.setString(1, j.getNombre());
		stat.setInt(2, j.getPuntos());

		stat.executeUpdate();

		stat.close();

		return new Jugador(j.getNombre(), j.getPuntos());
	}

	public void deleteJugador(final Jugador j) throws SQLException {
		PreparedStatement stat = conn
				.prepareStatement("delete from jugador where name = ?");
		stat.setString(1, j.getNombre());

		stat.executeUpdate();
		stat.close();
	}

	public void modifyJugador(final Jugador j) throws SQLException {
		PreparedStatement stat = conn
				.prepareStatement("update jugador set name=? , puntos=?");
		stat.setString(1, j.getNombre());
		stat.setInt(2, j.getPuntos());

		stat.executeUpdate();

		stat.close();
	}
}
